class Program{
    static void Main (string []args){
        //创建Person类实例
        //new 关键字在堆内存 分配空间 并调用构造函数
        Person person = new Person("张三", 25);
        person.Introduce();

        Car car1 = new Car("京A88888");
        Car car2 = new Car("京A66666");
        Console.WriteLine(car1.LicensePlate);
        //访问静态成员，类级别数据
        Car.DisplayTotal();
    }
}

public class Person{
    //私有字段：封装数据存储
    private string _name;
    private int _age;

    ///  <summary>   
    ///  姓名属性：封装字段的访问
    ///  1. 提供数据的验证
    ///  2. 控制读写的权限
    ///  </summary>
    public string Name{
        get{return _name;}
        set{
            //数据验证，确保非空
            if(!string.IsNullOrEmpty(value)){
                _name = value;
            }
        }
    }

    ///  <summary>
    ///  年龄属性
    ///  特性：
    ///  自动拒绝输入
    ///  </summary>    
    public int Age{
        get => _age; //简写形式 等价于 get{return _age;}
        set => _age = value >= 0 ? value : 0;
    }

    /// <summary>
    /// 构造方法
    /// 特点：
    /// 1. 与类同名
    /// 2. 没有返回类型
    /// 3. 通过属性初始化出发，验证逻辑
    /// </summary>
    /// <param name="name"></param>
    /// <param name="age"></param>
    public Person(string name, int age){
        //通过属性赋值，而非直接操作字段
        Name = name; //调用Name 属性的set访问器
        Age = age;   //调用A个属性的set访问器
    }
    
    /// <summary>
    /// 实例方法
    /// 特点：
    /// 1. 必须通过对象实例调用
    /// 2. 可以访问实例成员和静态成员
    /// </summary>
    public void Introduce(){
        Console.WriteLine($"大家好，我是{Name}，今年{Age}岁");
    }
}


public class Car{
    /// <summary>
    /// 实例属性
    /// 特性：
    /// 1.只读属性：只能在构造函数中初始化
    /// 2.没有set 访问器
    /// </summary>
    public string LicensePlate{get;}

    /// <summary>
    /// 静态字段
    /// 特点：
    /// 1.类级别共享
    /// 2.内存中只有一份副本
    /// 3.通过类名访问
    /// </summary>
    public static int TotalCars = 0;

    ///  <summary>
    ///  静态方法
    ///  特性:
    ///  1.不能访问实例成员
    ///  2.通过类名直接调用
    ///  </summary>
    public static void DisplayTotal() => Console.WriteLine($"已生产{TotalCars}辆车");
    public Car(string plate){
        LicensePlate = plate;
        TotalCars++;
    }
}

/// <summary>
/// 工具类：仅包含静态成员，不需要实例化
/// </summary>
public class MathUtil{
    public static int Max(int a, int b) => a>b ? a:b;
}